<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>876. 链表的中间结点</title>
  </head>
  <body>
    <script>
      //     给定一个头结点为 head 的非空单链表，返回链表的中间结点。

      // 如果有两个中间结点，则返回第二个中间结点。

      //

      // 示例 1：

      // 输入：[1,2,3,4,5]
      // 输出：此列表中的结点 3 (序列化形式：[3,4,5])
      // 返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。
      // 注意，我们返回了一个 ListNode 类型的对象 ans，这样：
      // ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NULL.
      // 示例 2：

      // 输入：[1,2,3,4,5,6]
      // 输出：此列表中的结点 4 (序列化形式：[4,5,6])
      // 由于该列表有两个中间结点，值分别为 3 和 4，我们返回第二个结点。
      //

      // 来源：力扣（LeetCode）
      // 链接：https://leetcode.cn/problems/middle-of-the-linked-list
      // 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
      /**
       * Definition for singly-linked list.
       * function ListNode(val, next) {
       *     this.val = (val===undefined ? 0 : val)
       *     this.next = (next===undefined ? null : next)
       * }
       */
      /**
       * @param {ListNode} head
       * @return {ListNode}
       */
      var middleNode = function (head) {
        let mine = head
        let len = 0
        while (mine) {
          mine = mine.next
          len++
        }
        let middle = len % 2 === 0 ? len / 2 + 1 : Math.ceil(len / 2)
        while (middle - 1 > 0) {
          head = head.next
          middle--
        }
        return head
      }
    </script>
  </body>
</html>
